# 打印菱形
def print_diamond(size):
    # 上半部分
    for i in range(size):
        print(' ' * (size - i - 1) + '*' * (2*i + 1))
    # 下半部分
    for i in range(size - 2, -1, -1):
        print(' ' * (size - i - 1) + '*' * (2*i + 1))

# 调用函数打印边长为5的菱形
print_diamond(5)

# 打印水仙花树
def print_narcissistic_numbers():
    # 遍历100到999之间的所有数字
    for num in range(100, 1000):
        # 分解数字为百位、十位和个位
        a = num // 100
        b = (num // 10) % 10
        c = num % 10

        # 判断是否为水仙花数
        if num == a ** 3 + b ** 3 + c ** 3:
            print(num)


# 调用函数
print_narcissistic_numbers()

# 打印九九乘法表
for i in range(1, 10):
    for j in range(1, i+1):
        print('%d * %d = %d' % (j, i, j*i), end='\t')
    print()

# 打印完数
def is_perfect_number(n):
    # 初始化真因子之和
    sum_of_divisors = 0

    # 遍历所有小于n的正整数
    for i in range(1, n):
        if n % i == 0:
            sum_of_divisors += i

    # 判断是否为完数
    return sum_of_divisors == n


def print_perfect_numbers(start, end):
    # 遍历指定范围内的所有数
    for num in range(start, end + 1):
        if is_perfect_number(num):
            print(num)


# 打印1到10000之间的所有完数
print_perfect_numbers(1, 10000)

# 打印质数
def is_prime(n):
    # 特殊情况处理
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False

    # 检查从5开始的所有奇数
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6

    return True


def print_primes(start, end):
    # 遍历指定范围内的所有数
    for num in range(start, end + 1):
        if is_prime(num):
            print(num)


# 打印1到100之间的所有质数
print_primes(1, 100)

# 打印斐波那契数列
def fibonacci(n):
    # 初始化前两个数
    a, b = 0, 1

    # 打印前n个斐波那契数
    for _ in range(n):
        print(a, end=" ")
        a, b = b, a + b


# 打印前10个斐波那契数
fibonacci(10)
